// 这段类型声明的代码，实在看不懂，等大家把 ts 学习完整了再看
interface IEvents {
  [index: string]: Array<Function>;
}
interface IEventBus {
  events: IEvents;
  on: (key: string, func: Function) => void;
  emit: (key: string) => void;
}

// 设计模式是编程思想，跟语言无关
// 原理： 把一些函数，放到一个数组里面，后面需要使用的时候通过数组直接取出，调用
const EventBus: IEventBus = {
  events: {},
  // 订阅事件的方法
  //
  on(key: string, func: Function) {
    // 使用key对应一个数组，数组里面存着所有的函数
    if (!this.events[key]) {
      this.events[key] = [];
    }
    this.events[key].push(func);
  },
  // 发布事件的方法
  emit(key: string) {
    this.events[key].forEach((func) => func());
  },
};
export default EventBus;
